#ifndef hero_hpp
#define hero_hpp

#include <vector>
#include <string>
#include "main.hpp"
#include <vector>
#include <allegro.h>
#include "eq.hpp"
#include "findway.hpp"
#include "parser.hpp"
#include "questcontainer.hpp"
#include "npc.hpp"
#include "stuff.hpp"

#define TASK_NOTHING 0
#define TASK_MOVE 1
#define TASK_ATTACK 2
#define TASK_TALK 3
#define TASK_PICKUP_ITEM 4
#define TASK_TRANSITION 5

class cTask
{
    public:
        float x, y;
        short type;

        cTask(float xx, float yy, short t) {x = xx; y = yy; type = t;}
};

class cHero
{
    private:
        float speed;//predkosc poruszania
        float angle;//obrot postaci w radianach!!!
        float frame;//klatka
        bool range[9][9];//zasieg widzenia

        cTask * curTask;//obecne zadanie
        std::vector <cTask *> task;//kolejka zadan

        BITMAP * img;//obrazek z klatkami wszystkimi
        BITMAP * tmp;//tymczasowa grafika do obracania bohatera

        cStuff * stuff;//to eq ktore nosimy na sobie

        void delTask_getNext();
        void clearTasks();

        void talkWithNPC(BITMAP * bufor, cNPC * npc, bool &MOUSE_FREE, cDialog * d = NULL);//rozmowa z NPC
        void tradeWithNPC(BITMAP * bufor, cNPC * npc, bool &MOUSE_FREE);//handel z NPC

        inline void checkDragItem(cEQ * hEQ, cEQ * npcEQ, bool &MOUSE_FREE, sPoint &selItem, bool &fromHero);
        inline void checkItemInfo(cEQ * eq);

	public:
        sPoint * pos;//pozycja
        cEQ * eq;//ekwipunek boahtera
        cFindWay * fWay;//wyszukiwanie drogi

        int level;//poziom postaci
        std::string map_to_load; //przekazanie mapy do wczytania. ZLE ROZWIAZANIE , NIGDY TAK NIE ROB! :)
        cQuestContainer * questContainer;//kontener z questami

        void addTask(cTask * t);
        void setWay(std::vector <sPoint> way);//dodaje listę zadań
        void update(sPoint * show, cMap * map, BITMAP * bufor, bool &MOUSE_FREE);//updejt bohatera (pozycja hp, wyglad itd)
        bool move(float x, float y);//poruszenie sie bohatera o 1 klatke
        void draw(BITMAP * bufor, sPoint * show, sPoint * shift);//rysowanie bohatera

        void checkMouse(int mouse_x, int mouse_y, bool &MOUSE_FREE, cMap * map, sPoint * show, std::vector <cNPC*> * NPClist);
        void actualiseFog(cMap * map);//aktualizuje siatke mgły

		cHero(int x, int y, cItemResources * resPointer);
		~cHero();
};

#endif
